<?php

namespace App\Http\Controllers\Es;

use App\Http\Controllers\Controller;
use App\Services\EsService;
use Elastic\Elasticsearch\Client as EsClient;
use Illuminate\Http\Request;

class EsController extends Controller
{
    private string $host;
    private array $auth;
    private EsClient $esClient;

    public function __construct()
    {
        $this->host = env('ES_HOST') .':' . env('ES_PORT');
        $this->auth = [env('ES_USERNAME'), env('ES_PASSWORD')];

        $this->esClient = EsService::getInstance($this->host, $this->auth);
        // $this->esClient = EsService::getInstance($this->host, $this->auth); 重复代码可以查看是否重复生成实例
    }

    /**
     * 创建索引，即 mysql 的数据库，也即创建表；已经创建过的就会报错不允许重复创建。
     * 在 6.x 版本中 es 里的 type 已经被标记为 Deprecated （废弃）并将在 7.x 版本中移除。
     * 6.x 版本的文档建议一个索引（Index）中只放一个类型（Type），可以简单理解为一个数据库中只包含一个表。
     */
    public function create()
    {
        $index = [
            "index" => "user1"
        ];
        $ret = $this->esClient->indices()->create($index);
    }

    /**
     * 查看已经创建的索引(表)
     */
    public function show()
    {
        $table = $this->esClient->info(['index' => 'user']);
    }

    /**
     * 往已创建的索引(表)里添加数据
     */
    public function insert(Request $request)
    {
        $params = [
            'index' => 'user',
            'body'  => [
                'id' => 5,
                "username" => "林黛玉",
                "age" => 16,
                "hobbies" => "看书，聊天，刺绣",
                // "hobbies" => ["篮球", "游泳"],
                "isMale" => false
            ]
        ];

        /**
         * 自己使用 es 的第一个好处：
         * 看上面的 hobbies 字段，我存储了两种数据结构，一个是数组一个是字符串，在es里都是允许存储的，
         * 在 mysql 里同一个字段只允许一种数据类型。
         *
         * 然后搜索的时候不会管数据结构，只看搜索内容和字段内容，这是很神器的地方。
         */

        // Document will be indexed to my_index/_doc/<autogenerated ID>
        $response = $this->esClient->index($params);
        dd($response);
    }

    public function search()
    {
       $params = [
            'index' => 'user',
            'body' => [
                'query' => [
                    'match' => [ // match 会先把查询条件进行分词，不支持多字段搜索
                        // 'hobbies' => '篮 橄'
                        'hobbies' => '篮,橄',
                        // "isMale" => false // 这样会报错不支持这样搜索
                    ],
                    /*'multi_match' => [ // 要实现多字段搜索，只能对多个字段检索相同的值，不能一个字段一个值
                        'query' => '你要搜索的值',
                        'fields' => ['field1', 'field2', ...]
                    ]*/
                ]
            ]
       ];

       /**
        * 第二个好处：看上面的 hobbies 搜索，不管是用什么符号分割，都能匹配到相应的内容。
        */

       $ret = $this->esClient->search($params);
       dd($ret->asArray());
    }
}
